/**
 * 创建文件夹: 同步/异步,可递归
 * 		若异步+递归+可中断: 使用$.fsMkdix()
 * @param dir string 目录路径  若存在目录:正常返回
 * @param opt json|null 选项
 * 		mode: string 创建权限  存在不改 默认:'755'
 * 		recu: boolean 是否递归  默认:true
 * 		syn: boolean 是否同步  默认false:异步
 * @return Promise|string  !opt.syn->Promise
 * 		string: 格式化路径 $PATH.resolve(dir)
 */
$.fsMkdir = function(dir, opt=null){
	const $FS=require('node:fs'), $PATH=require('node:path');
	const V = (v,e)=>v.isDirectory()?v.full:$.err('$.fsMkdir',e);
	const DEF={mode:'755',recu:true}, ERR=(e,o)=>{
		const d=o.dir;  let x=e.code;  if(x==='EISDIR') return d;
		if(x!=='EEXIST') $.err('$.fsMkdir',e);  const syn=o.syn;
		x=$.fsStat(d,{syn}); return syn?V(x,e):x.then(v=>V(v,e));
	}
	$.fsMkdir = function(dir, opt=null){
		opt=$.mix({},DEF,opt,{dir:$PATH.resolve(dir)});
		const opx = {mode:opt.mode, recursive:opt.recu};
		if(!opt.syn) return $.fsAsync('mkdir', dir, opx)
			.then(()=>opt.dir).catch(err=>ERR(err,opt));
		try{ $FS.mkdirSync(dir,opx); return opt.dir; }
		catch(err){ return ERR(err, opt); }
	};
	return $.fsMkdir(dir, opt);
};
